package com.jxw.test.application.base.apiversion;

import com.jxw.test.application.base.apiversion.annotation.ApiVersion;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.servlet.mvc.condition.RequestCondition;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import java.lang.reflect.Method;

/**
 * 自定义的接口多版本映射器
 */
public class ApiVersionHandlerMapping extends RequestMappingHandlerMapping {

    /**
     * Spring容器初始化时触发该方法
     *
     * 所有的Controller对象会依次调用该方法，根据当前Controller的类信息，
     * 返回一个符合当前Controller元数据的RequestCondition（请求条件）对象
     * 参数：就是一个Controller类对象
     * @param handlerType
     * @return
     */
    @Override
    protected RequestCondition<?> getCustomTypeCondition(Class<?> handlerType) {
        //找到所有标记了ApiVersion注解类上的该注解对象
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(handlerType, ApiVersion.class);
        return new ApiVersionRequestCondition(apiVersion != null ? apiVersion.value() : 1.0);
    }

    /**
     * 所有的Controller对象中所有方法会依次调用该方法，根据当前Method信息，
     * 返回一个Method对应的RequestCondition
     * 参数：依次就是Controller中的方法Method对象
     * @param method
     * @return
     */
    @Override
    protected RequestCondition<?> getCustomMethodCondition(Method method) {
        //找到所有标记了ApiVersion注解方法上的该注解对象
        ApiVersion apiVersion = AnnotationUtils.findAnnotation(method, ApiVersion.class);
        if (apiVersion == null) {
            //尝试从类上获取@ApiVersion注解
            apiVersion = AnnotationUtils.findAnnotation(method.getDeclaringClass(), ApiVersion.class);
        }
        return new ApiVersionRequestCondition(apiVersion != null ? apiVersion.value() : 1.0);
    }
}
